package aceim.app.screen; import java.util.List; import aceim.api.dataentity.ConnectionState; import aceim.app.Constants; import aceim.app.MainActivity; import aceim.app.R; import aceim.app.dataentity.Account; import aceim.app.dataentity.GlobalOptionKeys; import aceim.app.screen.pano.PanoScreen; import aceim.app.screen.simple.SimpleScreen; import aceim.app.screen.tablet.TabletScreen; import aceim.app.utils.ViewUtils; import aceim.app.utils.linq.KindaLinqRule; import aceim.app.view.page.Page; import aceim.app.view.page.contactlist.ContactList; import android.annotation.SuppressLint; import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; import android.os.RemoteException; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.FrameLayout; @SuppressLint("InlinedApi") public abstract class Screen extends FrameLayout { private final boolean requireDirtyMenuButtonHack; public Screen(MainActivity activity) { super(activity); ViewUtils.setWallpaperMode(getActivity(), this); requireDirtyMenuButtonHack = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && (activity.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_XLARGE) > 0; } public MainActivity getActivity() { return (MainActivity) getContext(); } public static final Screen getScreen(MainActivity activity) { //TODO rename key_view_type String screenName = activity.getSharedPreferences(Constants.SHARED_PREFERENCES_GLOBAL, 0) .getString(GlobalOptionKeys.SCREEN_TYPE.name(), activity.getString(R.string.default_screen_type)); if (screenName == null || screenName.equals("Auto")) { if (ViewUtils.isTablet(activity)) { screenName = TabletScreen.class.getName(); } else { screenName = SimpleScreen.class.getName(); } } //TODO support 3rd party screens? if (screenName.equals(PanoScreen.class.getName())) { return new PanoScreen(activity); } else if (screenName.equals(TabletScreen.class.getName())) { return new TabletScreen(activity); } else { return new SimpleScreen(activity); } } protected final OnLongClickListener mMenuButtonLongClickListener = new OnLongClickListener() { @Override public boolean onLongClick(View v) { List<Page> pages = findPagesByRule(new KindaLinqRule<Page>() { @Override public boolean match(Page t) { return t instanceof ContactList; } }); for (Page page : pages) { Account a = ((ContactList)page).getAccount(); if (a.getConnectionState() == ConnectionState.DISCONNECTED) { try { getActivity().getCoreService().connect(a.getServiceId()); } catch (RemoteException e) { getActivity().onRemoteException(e); } } } return true; } }; protected final OnClickListener mMenuButtonClickListener = new OnClickListener() { @Override public void onClick(View v) { if (requireDirtyMenuButtonHack) { Configuration config = getContext().getResources().getConfiguration(); config.screenLayout &= ~Configuration.SCREENLAYOUT_SIZE_XLARGE; config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_LARGE; } getActivity().openOptionsMenu(); } }; protected OnClickListener mTabClickListener = new OnClickListener() { @Override public void onClick(View v) { setSelectedPage(((Page)v.getTag()).getPageId()); } }; public boolean onCurrentPageKeyDown(int i, KeyEvent event) { return getSelectedPage().onKeyDown(i, event); } public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) { getSelectedPage().onCreateOptionsMenu(menu, menuInflater); } public void onPrepareOptionsMenu(Menu menu) { if (requireDirtyMenuButtonHack) { Configuration config = getContext().getResources().getConfiguration(); config.screenLayout &= ~Configuration.SCREENLAYOUT_SIZE_LARGE; config.screenLayout |= Configuration.SCREENLAYOUT_SIZE_XLARGE; } getSelectedPage().onPrepareOptionsMenu(menu); } public void onOptionsItemSelected(MenuItem item) { getSelectedPage().onOptionsItemSelected(item); } public abstract void addPage(Page page, boolean setAsCurrent); public abstract Page findPage(String pageId); //public abstract void removePage(String pageId); public abstract void removePage(Page page); public abstract void setSelectedPage(String pageId); public abstract Page getSelectedPage(); public abstract Page getSelectedContactList(); public abstract void onPageChanged(String pageId); public abstract List<Page> findPagesByRule(KindaLinqRule<Page> rule); public abstract List<Page> getAllPages(); public abstract void updateTabWidget(Page p); public abstract void storeScreenSpecificData(Bundle bundle); public abstract void recoverScreenSpecificData(Bundle bundle); }